package org.grayrabbit.commons.dao;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;

public interface GenericDao<T, PK extends Serializable> {
	/** 
     * 插入一个实体（在数据库INSERT一条记录） 
     * @param entity 实体对象 
     */  
	public void insert(T entity);
	
	/** 
     * 修改一个实体对象（UPDATE一条记录） 
     * @param entity 实体对象 
     * @return 修改的对象个数，正常情况=1 
     */  
    public abstract int update(T entity); 
    
    public abstract int bulkUpdate(QueryCondition condition);
    
    public abstract int delete(QueryCondition condition);
    
    
    /** 
     * 查询整表总记录数 
     * @return 整表总记录数 
     */  
    public abstract int count();
    
    /** 
     * 查询符合条件的记录数 
     * @param param 查询条件参数，包括WHERE条件（其他参数内容不起作用）。此参数设置为null，则相当于count() 
     * @return 
     */  
    public abstract int count(QueryCondition condition);
    
    /** 
     * 按主键取记录 
     * @param primaryKey 主键值 
     * @return 记录实体对象，如果没有符合主键条件的记录，则返回null 
     */  
    public abstract T get(PK primaryKey);
    
    /** 
     * 按主键取记录 
     * @param primaryKey 主键值 
     * @return 记录实体对象，如果没有符合主键条件的记录，则 throw DataAccessException 
     */  
    public abstract T load(PK primaryKey) throws DataAccessException;  
    
    /** 
     * 取全部记录 
     * @return 全部记录实体对象的List 
     */  
    public abstract List<T> findAll();  
      
    /** 
     * 按条件查询记录 
     * @param param 查询条件参数，包括WHERE条件、分页条件、排序条件 
     * @return 符合条件记录的实体对象的List 
     */  
    public abstract List<T> find(QueryCondition condition); 
    
    /**
	 * 查询语句
	 * @param qc
	 * @return
	 */
	public <X> List<X> query(QueryCondition condition);
	
	/**
	 * 查询语句，迭代器
	 * @param qc
	 * @return
	 */
	public <X> Iterator<X> iterator(QueryCondition qc);
    
}
